package com.javaweb.aop;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 * @desc: 使用 @NPECatch 注解实现对类级别或方法级别方法执行中的异常进行统一捕获处理。
 *        处理逻辑：捕获 NullPointerException 并输出到控制台。
 */
@Aspect
@Component
@Slf4j
public class NullExceptionAspect {

    // 定义一个切点，拦截带有 @NPECatch 注解的方法或类
    @Pointcut("@within(com.javaweb.aop.NPECatch) || @annotation(com.javaweb.aop.NPECatch)")
    public void npeCatchPointcut() {
        // 切点方法，内容留空
    }

    // 使用 @AfterThrowing 来捕获 NPE 异常
    @AfterThrowing(pointcut = "npeCatchPointcut()", throwing = "ex")
    public void handleNullPointerException(NullPointerException ex) {
        // 处理 NullPointerException 的逻辑，输出到控制台
        log.error("Caught NullPointerException: " + ex.getMessage(), ex);
        System.out.println("NullPointerException caught and handled: " + ex.getMessage());
    }
}
